package com.lesama.pool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/*
创建自定义线程池
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize: 核心线程数量
maximumPoolSize： 最大线程数量
keepAliveTime： 空闲时间
unit： 时间单位
workQueue： 任务队列（指定排队任务数）  不能为null
threadFactory： 线程对象任务工厂   不能为null
handler： 拒绝策略   不能为null

任务队列： 1) 有界队列   new ArrayBlockingQueue<>(10)
         2) 无界队列   new LinkedBlockingQueue<>()

拒绝策略：
ThreadPoolExecutor.AbortPolicy   丢弃任务并抛出RejectedExecutionException异常（默认）
ThreadPoolExecutor.DiscardPolicy   丢弃任务但不抛出异常（不推荐）
ThreadPoolExecutor.DiscardOldestPolicy   丢弃任务队列中等待最久的任务，然后把当前任务加入队列中
ThreadPoolExecutor.CallerRunsPolicy   调用任务的run()方法，绕过线程池直接执行  体现：main线程执行了任务

当任务数量不超过核心线程数+任务队列数量，只会调度核心线程
当任务数量不超过最大线程数+任务队列数量，会开始调度临时线程
当任务数量超过最大线程数+任务队列数量，会使用拒绝策略
 */
public class ThreadPoolDemo2 {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPool3 = new ThreadPoolExecutor(
                2,
                5,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

        for (int i = 0; i < 16; i++) {
            threadPool3.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + "提交了任务");
                }
            });
        }
    }
}
